package com.lian.aieduc.websocket;

import jakarta.websocket.OnClose;
import jakarta.websocket.OnMessage;
import jakarta.websocket.OnOpen;
import jakarta.websocket.Session;
import jakarta.websocket.server.PathParam;
import jakarta.websocket.server.ServerEndpoint;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;

import java.io.IOException;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

@Component
@Slf4j
@Service
@ServerEndpoint("/ws/{sid}")
public class WebSocketServer {

    //存放会话对象
    private static Map<String, Session> sessionMap = new HashMap<>();
    private Session session;

    // 建立连接时调用
    @OnOpen
    public void onOpen(Session session, @PathParam("sid") String sid) {
        System.out.println("客户端：" + sid + "建立连接");
        sessionMap.put(sid, session);
    }

    /**
     * 收到客户端消息后调用的方法
     *
     * 这里修改了sendToAllClient方法的调用逻辑，排除发送消息的原客户端
     *
     * @param message 客户端发送过来的消息
     */
    @OnMessage
    public void onMessage(String message, @PathParam("sid") String sid) {
        System.out.println("收到来自客户端：" + sid + "的信息:" + message);
        this.sendToAllClient(message, sid);
    }

    // 连接关闭时调用
    @OnClose
    public void onClose(@PathParam("sid") String sid) {
        System.out.println("连接断开:" + sid);
        sessionMap.remove(sid);
    }

    /**
     * 发送消息给所有客户端（除了发送消息的原客户端）
     *
     * @param message 要发送的消息内容
     * @param fromSid 发送消息的原客户端的sid
     */
    public void sendToAllClient(String message, String fromSid) {
        log.info("发送消息:{}", message);
        Collection<Session> sessions = sessionMap.values();
        for (Session session : sessions) {
            String targetSid = getSidFromSession(session);
            if (!fromSid.equals(targetSid)) {
                try {
                    session.getBasicRemote().sendText(message);
                } catch (IOException e) {
                    log.info("messageerror:{}", e);
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 根据Session对象获取对应的sid
     *
     * @param session 要获取sid的Session对象
     * @return 对应的sid，如果没找到则返回null
     */
    private String getSidFromSession(Session session) {
        for (Map.Entry<String, Session> entry : sessionMap.entrySet()) {
            if (entry.getValue().equals(session)) {
                return entry.getKey();
            }
        }
        return null;
    }

    public void sendToOneClient(String message, String sid) {

        Session session = sessionMap.get(sid);
        if (session!= null) {
            try {
                session.getBasicRemote().sendText(message);
            } catch (IOException e) {
                log.error("向客户端 {} 发送消息时出错: {}", sid, e.getMessage());
            }
        } else {
            log.warn("找不到 sid 为 {} 的客户端会话", sid);
        }
    }
}